package com.c2c.mapper;

import com.c2c.po.User;
import com.c2c.po.enums.impl.UsersState;
import com.c2c.utils.SQLProviderUtil;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {


    /**
     * 查看所有用户
     *
     * @return 返回所有用户数据
     */
//    @Select("select * from user")
    List<User> findAllUser();

    /**
     * 账号登录
     *
     * @param userAccount 账号ID
     * @return 该账号ID对应User表中的数据
     */
//    @Select("select * from user where userAccount = #{userAccount}")
    User findByUserId(int userAccount);

    /**
     * 账号状态修改
     *
     * @param userAccount 账号ID
     * @param usersState  帐号状态枚举类
     *                    此处为何用@Param     因为我怕我忘了=-=
     *                    简便写法应该封装入一个User实体中，然后使用此实体传过来  使用实体类对应的数据名即可
     */
//    @Update("update user set userState = #{usersState} where userAccount = #{userAccount} ")
    void updateStateByUserId(@Param("userAccount") int userAccount, @Param("usersState") UsersState usersState);

    /**
     * 更新个人信息数据
     * 此处应该由用户端，用户自身
     *
     * @param user 封装类
     */
//    @Update("update user set userName = #{userName},userAddress = #{userAddress}, userPassword = #{userPassword} where userAccount = #{userAccount}")
    void updateInformationByUserId(User user);

    /**
     * 此处是作为举报惩罚,或其他而存在其中
     * 传入降低的信用值,从而达到惩罚目的
     *
     * @param user 封装类
     * @param type 确定是增加还是减少信用
     */
//
    @UpdateProvider(type = SQLProviderUtil.class, method = "updateCreditByUserIdUtil")
    void updateCreditByUserId(@Param("user") User user, @Param("type") boolean type);

    /**
     * 账户余额操作
     * 理论来说只能通过管理员，退款操作增加余额
     * 购买物品减少余额
     *
     * @param user 封装类
     * @param type 确定是增加还是减少金钱
     */
    @UpdateProvider(type = SQLProviderUtil.class, method = "updateMoneyByUserIdUtil")
    void updateMoneyByUserId(@Param("user") User user, @Param("type") boolean type);

    /**
     * 注册账号
     *
     * @param user 封装信息
     */
//    @Insert("insert into user values (#{userAccount}, #{userName},#{userPassword},#{userAddress},100,0,1)")
    void insertUser(User user);
}
